#include <iostream>

// glad.h 要放在glfw3.h之前
#include <glad/glad.h>
#include "GLFW/glfw3.h"
#include "imgui/imgui.h"
#include "imgui/imgui_impl_glfw.h"
#include "imgui/imgui_impl_opengl3.h"

#define WIN_WINDTH 600
#define WIN_HEIGHT 600

void initImGui(GLFWwindow* pWindow);
void renderScene();
void renderUI();

int main(){
    std::cout<<"00_setup_environment2!"<<std::endl;

    // 1.初始化
    glfwInit();
    //主版本 3.3.5，所以MAJOR=3,MINOR=3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    //次版本
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //使用核心模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 2.创建窗口 https://www.glfw.org/docs/latest/window_guide.html
    GLFWwindow* pWindow = glfwCreateWindow(WIN_WINDTH, WIN_HEIGHT, "hello opengl中文!", nullptr, nullptr);
    //上下文设置
    glfwMakeContextCurrent(pWindow);

    // 3.glad管理函数指针
    bool bLoadSuc = gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
    if(!bLoadSuc){
        std::cout << "Failed glad load glProcAddress!" << std::endl;
        return -1;
    }

    // 初始化ImGui
    initImGui(pWindow);

    // 4.主循环
    while (!glfwWindowShouldClose(pWindow)) {
        // 背景色
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        // 清空缓冲（不执行的话，会保留上一帧的像素）
        glClear(GL_COLOR_BUFFER_BIT);

        //渲染场景
        renderScene();

        // 注意场景和UI的渲染顺序，谁在后面谁被遮挡
        renderUI();

        //交换缓存
        glfwSwapBuffers(pWindow);
        //事件处理
        glfwPollEvents();
    }

    // 5.资源回收
    glfwTerminate();
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();

    return 0;
}


/**
 * 初始化ImGui
 */
void initImGui(GLFWwindow* pWindow) {
    // 检查版本
    IMGUI_CHECKVERSION();
    // 上下文
    ImGui::CreateContext();
    // 设置黑色主题
    ImGui::StyleColorsDark();
    // 嵌入住glfw上下文中
    ImGui_ImplGlfw_InitForOpenGL(pWindow, true);
    // OpenGL版本号3.3
    ImGui_ImplOpenGL3_Init("#version 330");

    ImGuiIO& io = ImGui::GetIO();
    (void) io;
    // 字体设置
    io.Fonts->AddFontFromFileTTF("resource/fonts/Cousine-Regular.ttf", 13.0f, NULL, io.Fonts->GetGlyphRangesDefault());
    io.Fonts->AddFontFromFileTTF("resource/fonts/DroidSans.ttf", 13.0f, NULL, io.Fonts->GetGlyphRangesDefault());
    io.Fonts->AddFontFromFileTTF("resource/fonts/Karla-Regular.ttf", 13.0f, NULL, io.Fonts->GetGlyphRangesDefault());
    io.Fonts->AddFontFromFileTTF("resource/fonts/ProggyClean.ttf", 13.0f, NULL, io.Fonts->GetGlyphRangesDefault());
    io.Fonts->AddFontFromFileTTF("resource/fonts/Roboto-Medium.ttf", 13.0f, NULL, io.Fonts->GetGlyphRangesDefault());
}

/**
 * 渲染场景
 */
void renderScene() {
    // empty
}

/**
 * 渲染UI
 */
void renderUI() {
    // 1. ImGui渲染操作
    ImGui_ImplOpenGL3_NewFrame();
    ImGui_ImplGlfw_NewFrame();
    ImGui::NewFrame();

    // 2. UI准备
    bool bShowDemoWindow = true;
    // 显示ImGui自带的demo window
    ImGui::ShowDemoWindow(&bShowDemoWindow);

    // 3. 渲染
    ImGui::Render();
    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}